package com.huike.clues.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huike.clues.domain.dto.SysDictDataPageDTO;
import com.huike.clues.domain.dto.SysDictTypePageDTO;
import com.huike.clues.domain.entity.SysDictData;
import com.huike.clues.mapper.SysDictDataMapper;
import com.huike.clues.service.ISysDictDataService;
import com.huike.common.annotation.AutoFill;
import com.huike.common.constant.Constants;
import com.huike.common.constant.ErrorMessageConstants;
import com.huike.common.constant.HttpStatus;
import com.huike.common.constant.ScheduleConstants;
import com.huike.common.core.page.PageDomain;
import com.huike.common.core.page.TableDataInfo;
import com.huike.common.enums.FillType;
import com.huike.common.exception.BaseException;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;

/**
 * @Description SysDictDataServiceImpl
 * @Author moweihua
 * @Date 2023-10-2023/10/15
 */
@Service
@RequiredArgsConstructor
public class SysDictDataServiceImpl implements ISysDictDataService {
    private final SysDictDataMapper sysDictDataMapper;

    private final HttpServletResponse httpServletResponse;

    /**
     * 新增字典数据
     *
     * @param sysDictData
     */
    @Override
    @AutoFill(FillType.ALL)
    public void add(SysDictData sysDictData) {
        if (ObjectUtils.isEmpty(sysDictData)) {
            throw new BaseException("字典数据为空");
        }
        sysDictDataMapper.insert(sysDictData);
    }

    /**
     * 修改保存字典数据
     *
     * @param sysDictData
     */
    @Override
    @AutoFill(FillType.UPDATE)
    public void update(SysDictData sysDictData) {
        if (ObjectUtils.isEmpty(sysDictData)) {
            throw new BaseException(ErrorMessageConstants.DICT_INFORMATION_DATA_ERROR);
        }
        LambdaQueryWrapper<SysDictData> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysDictData::getDictCode, sysDictData.getDictCode());
        sysDictDataMapper.update(sysDictData, wrapper);
    }

    /**
     * 根据字典数据查询字典数据信息
     *
     * @param dictType
     * @return
     */
    @Override
    public List<SysDictData> findByDictType(String dictType) {
        QueryWrapper<SysDictData> objectQueryWrapper = new QueryWrapper<>();
        // 查询条件
        objectQueryWrapper.eq("dict_type", dictType);
        // 根据条件查询，并封装数据
        return sysDictDataMapper.selectList(objectQueryWrapper);
    }

    /**
     * 删除字典信息
     *
     * @param dictCodes
     */
    @Override
    public void delete(List<Long> dictCodes) {
        QueryWrapper<SysDictData> queryWrapper = new QueryWrapper<>();
        // 删除条件(停用状态下才能删除)
        queryWrapper.in("dict_code", dictCodes).eq("status", ScheduleConstants.Status.PAUSE.getValue());
        // 根据条件删除
        sysDictDataMapper.delete(queryWrapper);
    }


    /**
     * 查询字典数据详细
     *
     * @param dictCode
     */
    @Override
    public SysDictData findByDictCode(Long dictCode) {
        LambdaQueryWrapper<SysDictData> wrapper = new LambdaQueryWrapper<>();
        // 查询条件
        wrapper.eq(SysDictData::getDictCode, dictCode);
        return sysDictDataMapper.selectOne(wrapper);
    }

    /**
     * 字典列表
     *
     * @param sysDictDataPageDTO
     * @return
     */
    @Override
    public TableDataInfo<List<SysDictData>> list(SysDictDataPageDTO sysDictDataPageDTO) {
        Page<SysDictData> page = new Page<>(sysDictDataPageDTO.pageNum, sysDictDataPageDTO.pageSize);
        LambdaQueryWrapper<SysDictData> wrapper = new LambdaQueryWrapper<>();
        // 查询条件
        wrapper.like(sysDictDataPageDTO.getDictType() != null, SysDictData::getDictType,
                sysDictDataPageDTO.getDictType());
        wrapper.like(sysDictDataPageDTO.getDictLabel() != null, SysDictData::getDictLabel,
                sysDictDataPageDTO.getDictLabel());
        wrapper.eq(sysDictDataPageDTO.getStatus() != null, SysDictData::getStatus, sysDictDataPageDTO.getStatus());
        sysDictDataMapper.selectPage(page, wrapper);
        // 封装数据返回
        TableDataInfo<List<SysDictData>> tableDataInfo = new TableDataInfo<>();
        tableDataInfo.setTotal(page.getTotal());
        tableDataInfo.setRows(page.getRecords());
        return tableDataInfo;
    }

    /**
     * 字典导出
     * @param dto
     * @return
     */
    @Override
    public List<SysDictData> getDictDataList(SysDictDataPageDTO dto) {
        TableDataInfo<List<SysDictData>> tableDataInfo = list(dto);
        List<SysDictData> list = tableDataInfo.getRows();
        return list;
    }

    /**
     * 字典导出
     * @param sysDictDataPageDTO
     */
    // @Override
    // public void export(SysDictDataPageDTO sysDictDataPageDTO) {
    //     try (
    //             // 读取类路径下的文件template/字典数据报表模板.xlsx，输入流
    //             InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/1689015872903字典数据.xlsx");
    //             // 创建工作簿
    //             XSSFWorkbook workbook = new XSSFWorkbook(in);
    //             // 浏览器文件输出流
    //             ServletOutputStream out = httpServletResponse.getOutputStream()) {
    //         // 获取表格
    //         XSSFSheet sheet = workbook.getSheetAt(0);
    //
    //         // 查询概览数据
    //         TableDataInfo<List<SysDictData>> list = list(sysDictDataPageDTO);
    //         //获取到数据
    //         List<SysDictData> rows = list.getRows();
    //
    //         // 填充excel对应的概览数据
    //         // 补全每条字典信息的明细数据
    //         for (int i = 0; i < rows.size(); i++) {
    //             // 查询每条明细数据
    //             SysDictData sysDictData = rows.get(i);
    //             // 填充excel每行明细数据
    //             XSSFRow row = sheet.getRow(i+1);
    //             row.getCell(0).setCellValue(sysDictData.getDictCode());// 字典编码
    //             row.getCell(1).setCellValue(sysDictData.getDictSort());// 字典排序
    //             row.getCell(2).setCellValue(sysDictData.getDictLabel());// 字典标签
    //             row.getCell(3).setCellValue(sysDictData.getDictValue());// 字典键值
    //             row.getCell(4).setCellValue(sysDictData.getDictType());// 字典类型
    //             row.getCell(5).setCellValue(sysDictData.getIsDefault());// 是否默认
    //             row.getCell(6).setCellValue(sysDictData.getStatus());// 状态
    //         }
    //         // 将填充好的工作簿输出
    //         workbook.write(out);
    //     } catch (Exception e) {
    //         e.printStackTrace();
    //         throw new RuntimeException(e);
    //     }
    // }
}
